// package com.ruoyi.pay.service.impl;
//
// import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
// import com.ruoyi.common.core.domain.AjaxResult;
// import com.ruoyi.common.utils.DateUtils;
// import com.ruoyi.common.utils.StringUtils;
// import com.ruoyi.common.utils.pay.HttpServletUtils;
// import com.ruoyi.pay.config.WxPayAutoCertificateConfig;
// import com.ruoyi.pay.config.WxPayAutoConfig;
// import com.ruoyi.pay.domain.*;
// import com.ruoyi.pay.mapper.WxpayConfigMapper;
// import com.ruoyi.pay.service.IWxOrderService;
// import com.ruoyi.pay.service.IWxPayLogService;
// import com.ruoyi.pay.service.PayService;
// import com.wechat.pay.java.core.exception.HttpException;
// import com.wechat.pay.java.core.exception.MalformedMessageException;
// import com.wechat.pay.java.core.exception.ServiceException;
// import com.wechat.pay.java.core.notification.NotificationParser;
// import com.wechat.pay.java.core.notification.RequestParam;
// import com.wechat.pay.java.service.payments.model.Transaction;
// import com.wechat.pay.java.service.payments.nativepay.NativePayService;
// import com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest;
// import com.wechat.pay.java.service.payments.nativepay.model.QueryOrderByIdRequest;
// import com.wechat.pay.java.service.payments.nativepay.model.QueryOrderByOutTradeNoRequest;
// import com.wechat.pay.java.service.refund.RefundService;
// import com.wechat.pay.java.service.refund.model.*;
// import org.slf4j.Logger;
// import org.slf4j.LoggerFactory;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.stereotype.Service;
// import org.springframework.transaction.annotation.Transactional;
//
// import javax.annotation.Resource;
// import javax.servlet.http.HttpServletRequest;
// import java.math.BigDecimal;
// import java.util.*;
//
//
// /**
//  * @author caozhen
//  * @ClassName WxPayService
//  * @description: 微信支付
//  * @date 2024年01月03日
//  * @version: 1.0
//  */
// @Service
// public class PayServiceImpl implements PayService {
//
//     private static final Logger log = LoggerFactory.getLogger(PayServiceImpl.class);
//     @Resource
//     private WxpayConfig wxPayConfig;
//     @Autowired
//     private WxPayAutoCertificateConfig rsaAutoCertificateConfig;
//     @Autowired
//     private WxPayAutoConfig wxPayAutoConfig;
//     @Autowired
//     private IWxOrderService wxOrderService;
//     @Autowired
//     private IWxPayLogService wxPayLogService;
//     @Autowired
//     private WxpayConfigMapper wxpayConfigMapper;
// //    @Autowired
// //    private IGameDeviceService gameDeviceService;
//
//
//     /***
//      * 预支付订单
//      * @param req
//      * @return
//     */
//     public AjaxResult createOrder(CreateOrderReq req) throws Exception {
//         NativePayService nativePayService = rsaAutoCertificateConfig.nativePayService();
//         String imgUrl = null;
//         if (req == null) {
//             return AjaxResult.error("创建订单失败，缺少参数！");
//         }
//         //先解密
//
//         String orderNo = req.getOutTradeNo();
//         BigDecimal totalFee = req.getTotalFee();
//         //创建初始化订单
//         //todo,创建订单这边你们自己来（后面我会放出表结构）
//         //请求微信支付相关配置
//         try {
//             PrepayRequest request = new PrepayRequest();
//             QueryWrapper<WxpayConfig> wrapper = new QueryWrapper<>();
//             wrapper.eq("is_check", 0);
//             wxPayConfig = wxpayConfigMapper.selectOne(wrapper);
//             request.setAppid(wxPayConfig.getAppId());
//             request.setMchid(wxPayConfig.getMerchantId());
//             request.setDescription(req.getDescription());
//             request.setOutTradeNo(orderNo);
//             request.setNotifyUrl(wxPayConfig.getPayNotifyUrl());
//             com.wechat.pay.java.service.payments.nativepay.model.Amount amount = new com.wechat.pay.java.service.payments.nativepay.model.Amount();
//             amount.setTotal(totalFee.multiply(new BigDecimal("100")).intValue());
//             request.setAmount(amount);
//             //log.info("请求预支付下单，请求参数：{}", JSONUtils.toJSONString(request));
//             // 调用预下单接口
//             com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse prepay = nativePayService.prepay(request);
//             imgUrl = prepay.getCodeUrl();
//             req.setImgUrl(imgUrl);
//             insertPayOrder(req);
//             log.info("订单【{}】发起预支付成功，返回信息：{}", orderNo, prepay);
//         } catch (HttpException e) { // 发送HTTP请求失败
//             log.error("微信下单发送HTTP请求失败，错误信息：{}", e.getHttpRequest());
//             return AjaxResult.error("下单失败");
//         } catch (ServiceException e) { // 服务返回状态小于200或大于等于300，例如500
//             log.error("微信下单服务状态错误，错误信息：{}", e.getErrorMessage());
//             return AjaxResult.error("下单失败");
//         } catch (MalformedMessageException e) { // 服务返回成功，返回体类型不合法，或者解析返回体失败
//             log.error("服务返回成功，返回体类型不合法，或者解析返回体失败，错误信息：{}", e.getMessage());
//             return AjaxResult.error("下单失败");
//         }
//
//         return AjaxResult.success().put("data", imgUrl);
//     }
//
//
//     public void insertPayOrder(CreateOrderReq req) {
//         WxOrder wxOrder = new WxOrder();
//         wxOrder.setUuid(req.getOutTradeNo());
//         wxOrder.setRemark(req.getUserId());
//         wxOrder.setTradeName("积分商品");
//         wxOrder.setDescription(req.getDescription());
//         wxOrder.setOutTradeNo(req.getOutTradeNo());
//         wxOrder.setTotalFee(req.getTotalFee());
//         wxOrder.setPayStatus(0);
//         wxOrder.setStatus(1);
//         wxOrder.setImgUrl(req.getImgUrl());
//         wxOrderService.insertWxOrder(wxOrder);
//     }
//     /**
//      * 微信支付回调通知
//      * @param request
//      * @return
//      * @throws Exception
//      */
//     @Transactional
//     public synchronized Map<String, String> payNotify(HttpServletRequest request) throws Exception {
//         log.info("------收到支付通知------");
//         // 请求头Wechatpay-Signature
//         String signature = request.getHeader("Wechatpay-Signature");
//         // 请求头Wechatpay-nonce
//         String nonce = request.getHeader("Wechatpay-Nonce");
//         // 请求头Wechatpay-Timestamp
//         String timestamp = request.getHeader("Wechatpay-Timestamp");
//         // 微信支付证书序列号
//         String serial = request.getHeader("Wechatpay-Serial");
//         // 签名方式
//         String signType = request.getHeader("Wechatpay-Signature-Type");
//         // 构造 RequestParam
//         RequestParam requestParam = new RequestParam.Builder()
//                 .serialNumber(serial)
//                 .nonce(nonce)
//                 .signature(signature)
//                 .timestamp(timestamp)
//                 .signType(signType)
//                 .body(HttpServletUtils.getRequestBody(request))
//                 .build();
//
//         // 初始化 NotificationParser
//         NotificationParser parser = new NotificationParser( wxPayAutoConfig.rsaAutoCertificateConfig());
//         // 以支付通知回调为例，验签、解密并转换成 Transaction
//         log.info("验签参数：{}", requestParam);
//         Transaction transaction = parser.parse(requestParam, Transaction.class);
//         log.info("验签成功！-支付回调结果：{}", transaction.toString());
//
//         Map<String, String> returnMap = new HashMap<>();
//         returnMap.put("code", "FAIL");
//         returnMap.put("message", "失败");
//         //修改订单前，建议主动请求微信查询订单是否支付成功，防止恶意post
//         QueryWrapper<WxOrder> wrapper = new QueryWrapper<>();
//         wrapper.eq("out_trade_no", transaction.getOutTradeNo());
//         //wrapper.eq("transaction_id", transaction.getTransactionId());
//         WxOrder wxOrderEntity = wxOrderService.selectOne(wrapper);
//         if (wxOrderEntity != null) {
//             if (wxOrderEntity.getPayStatus() == 1) {
//                 //此时已经是支付成功，不在处理订单信息
//                 returnMap.put("code", "SUCCESS");
//                 returnMap.put("message", "成功");
//                 return returnMap;
//             }
//         }
//         if (Transaction.TradeStateEnum.SUCCESS != transaction.getTradeState()) {
//             log.info("内部订单号【{}】,微信支付订单号【{}】支付未成功", transaction.getOutTradeNo(), transaction.getTransactionId());
//             if (wxOrderEntity != null) {
//                 wxOrderEntity.setUpdateTime(new Date());
//                 wxOrderEntity.setPayStatus(2);
//                 wxOrderEntity.setPayNonce(nonce);
//                 wxOrderEntity.setTransactionId(transaction.getTransactionId());
//                 //修改订单信息
//                 wxOrderService.updateById(wxOrderEntity);
//             }
//             return returnMap;
//         }
//         if (wxOrderEntity != null) {
//             wxOrderEntity.setUpdateTime(new Date());
//             wxOrderEntity.setPayDate(new Date());
//             wxOrderEntity.setPayTime(new Date());
//             wxOrderEntity.setPayStatus(1);
//             wxOrderEntity.setPayNonce(nonce);
//             wxOrderEntity.setTransactionId(transaction.getTransactionId());
//             //修改订单信息
//             wxOrderService.updateById(wxOrderEntity);
//
//             //同时处理支付记录
//             QueryWrapper payWrapper = new QueryWrapper<WxPayLog>();
//             payWrapper.eq("out_trade_no", transaction.getOutTradeNo());
//             payWrapper.eq("pay_status", 1);//支付
//             WxPayLog wxPayLogEntity = wxPayLogService.selectOne(payWrapper);
//             if (wxPayLogEntity == null) {
//                 wxPayLogEntity = new WxPayLog();
//                 wxPayLogEntity.setUuid(UUID.randomUUID().toString());
//                 wxPayLogEntity.setCreateTime(new Date());
//                 wxPayLogEntity.setOutTradeNo(wxOrderEntity.getOutTradeNo());
//                 wxPayLogEntity.setPayStatus(1);
//                 wxPayLogEntity.setTotalFee(wxOrderEntity.getTotalFee());
//                 wxPayLogEntity.setTransactionId(wxOrderEntity.getTransactionId());
//                 wxPayLogEntity.setWxOpenId(wxOrderEntity.getWxOpenId());
//                 wxPayLogService.insert(wxPayLogEntity);
//                 // updateGameDevice(wxOrderEntity.getRemark(), wxOrderEntity.getDescription());
//             }
//         }
//
//         returnMap.put("code", "SUCCESS");
//         returnMap.put("message", "成功");
//         return returnMap;
//     }
//
//     /**
//      * 修改订单后的开始时间与结束时间
//      * @param outTradeNo
//      */
//     private void updatePoint(String outTradeNo) {
//         WxOrder order = wxOrderService.getOne(new QueryWrapper<WxOrder>().eq("out_trade_no", outTradeNo));
//
//     }
//
//
//     /**
//      * 根据商户订单号查询订单 outTradeNo
//      * @param req
//      * @return
//     */
//     @Transactional
//     public AjaxResult queryOrderByOrderNo(QueryOrderReq req) {
//         NativePayService nativePayService = rsaAutoCertificateConfig.nativePayService();
//         QueryOrderByOutTradeNoRequest queryRequest = new QueryOrderByOutTradeNoRequest();
//         queryRequest.setMchid(wxPayConfig.getMerchantId());
//         queryRequest.setOutTradeNo(req.getOrderNo());
//         try {
//             Transaction result = nativePayService.queryOrderByOutTradeNo(queryRequest);
//             LinkedHashMap retmap = new LinkedHashMap();
//             //支付成功
//             if (Transaction.TradeStateEnum.SUCCESS == result.getTradeState()) {
//                 log.info("内部订单号【{}】,微信支付订单号【{}】支付成功", result.getOutTradeNo(), result.getTransactionId());
//                 retmap.put("out_trade_no", result.getOutTradeNo());
//                 retmap.put("transaction_id", result.getTransactionId());
//                 retmap.put("success", true);
//                 retmap.put("msg", "支付成功！");
//                 retmap.put("success_time", DateUtils.getDateTimeString(DateUtils.stringToDateTime(result.getSuccessTime())));
//                 //主动查询
//                 QueryWrapper payWrapper = new QueryWrapper<WxOrder>();
//                 payWrapper.eq("out_trade_no", req.getOrderNo());
//                 WxOrder wxOrderEntity = wxOrderService.selectOne(payWrapper);
//                 if (wxOrderEntity != null) {
//                     if (wxOrderEntity.getPayStatus() != 1) {
//                         wxOrderEntity.setPayStatus(1);
//                         wxOrderEntity.setTransactionId(result.getTransactionId());
//                         wxOrderEntity.setPayTime(new Date());
//                         wxOrderEntity.setUpdateTime(new Date());
//                         wxOrderService.updateById(wxOrderEntity);
//                         QueryWrapper wrapper = new QueryWrapper<WxPayLog>();
//                         //同时处理支付记录
//                         wrapper.eq("out_trade_no", req.getOrderNo());
//                         WxPayLog wxPayLogEntity = wxPayLogService.selectOne(wrapper);
//                         if (wxPayLogEntity == null) {
//                             wxPayLogEntity = new WxPayLog();
//                             wxPayLogEntity.setCreateTime(new Date());
//                             wxPayLogEntity.setOutTradeNo(wxOrderEntity.getOutTradeNo());
//                             wxPayLogEntity.setPayStatus(1);
//                             wxPayLogEntity.setTotalFee(wxOrderEntity.getTotalFee());
//                             wxPayLogEntity.setTransactionId(result.getTransactionId());
//                             wxPayLogEntity.setWxOpenId(wxOrderEntity.getWxOpenId());
//                             wxPayLogService.insert(wxPayLogEntity);
//                         }
//                     }
//                 }
//             } else {
//                 log.info("内部订单号【{}】,微信支付订单号【{}】支付未成功", result.getOutTradeNo(), result.getTransactionId());
//                 retmap.put("out_trade_no", result.getOutTradeNo());
//                 retmap.put("transaction_id", result.getTransactionId());
//                 retmap.put("success", false);
//                 retmap.put("msg", "支付失败！");
//                 retmap.put("success_time", null);
//             }
//             return AjaxResult.success().put("data", retmap);
//         } catch (ServiceException e) {
//             log.error("订单查询失败，返回码：{},返回信息：{}", e.getErrorCode(), e.getErrorMessage());
//             return AjaxResult.error("订单查询失败！");
//         }
//     }
//
//      /**
//       *根据支付订单号查询订单 paymentNo
//       * @param req
//       * @return
//       **/
//     @Transactional
//     public AjaxResult queryOrderByPaymentNo(QueryOrderReq req) {
//         NativePayService nativePayService = rsaAutoCertificateConfig.nativePayService();
//         QueryOrderByIdRequest queryRequest = new QueryOrderByIdRequest();
//         queryRequest.setMchid(wxPayConfig.getMerchantId());
//         queryRequest.setTransactionId(req.getPaymentNo());
//         try {
//             Transaction result = nativePayService.queryOrderById(queryRequest);
//             LinkedHashMap map = new LinkedHashMap();
//             //支付成功
//             if (Transaction.TradeStateEnum.SUCCESS == result.getTradeState()) {
//                 log.info("内部订单号【{}】,微信支付订单号【{}】支付成功", result.getOutTradeNo(), result.getTransactionId());
//                 map.put("out_trade_no", result.getOutTradeNo());
//                 map.put("transaction_id", result.getTransactionId());
//                 map.put("success", true);
//                 map.put("msg", "支付成功！");
//                 map.put("success_time", DateUtils.getDateTimeString(DateUtils.stringToDateTime(result.getSuccessTime())));
//                 //主动查询
//                 QueryWrapper wrapper = new QueryWrapper<WxOrder>();
//                 wrapper.eq("transaction_id", req.getPaymentNo());
//                 WxOrder wxOrderEntity = wxOrderService.selectOne(wrapper);
//                 if (wxOrderEntity != null) {
//                     if (wxOrderEntity.getPayStatus() != 1) {
//                         wxOrderEntity.setPayStatus(1);
//                         wxOrderEntity.setPayDate(new Date());
//                         wxOrderEntity.setPayTime(new Date());
//                         wxOrderEntity.setUpdateTime(new Date());
//                         wxOrderService.updateById(wxOrderEntity);
//                         //同时处理支付记录
//                         QueryWrapper payWrapper = new QueryWrapper<WxPayLog>();
//                         payWrapper.eq("transaction_id", req.getPaymentNo());
//                         WxPayLog wxPayLogEntity = wxPayLogService.selectOne(payWrapper);
//                         if (wxPayLogEntity == null) {
//                             wxPayLogEntity = new WxPayLog();
//                             wxPayLogEntity.setCreateTime(new Date());
//                             wxPayLogEntity.setOutTradeNo(wxOrderEntity.getOutTradeNo());
//                             wxPayLogEntity.setPayStatus(1);
//                             wxPayLogEntity.setTotalFee(wxOrderEntity.getTotalFee());
//                             wxPayLogEntity.setTransactionId(result.getTransactionId());
//                             wxPayLogEntity.setWxOpenId(wxOrderEntity.getWxOpenId());
//                             wxPayLogService.insert(wxPayLogEntity);
//                         }
//                     }
//                 }
//             } else {
//                 log.info("内部订单号【{}】,微信支付订单号【{}】支付未成功", result.getOutTradeNo(), result.getTransactionId());
//                 map.put("out_trade_no", result.getOutTradeNo());
//                 map.put("transaction_id", result.getTransactionId());
//                 map.put("success", false);
//                 map.put("msg", "支付失败！");
//                 map.put("success_time", null);
//             }
//             return AjaxResult.success().put("data", map);
//         } catch (ServiceException e) {
//             log.error("订单查询失败，返回码：{},返回信息：{}", e.getErrorCode(), e.getErrorMessage());
//             return AjaxResult.error("订单查询失败！");
//         }
//     }
//
//      /** 微信申请退款
//      * @param outTradeNo 商户订单号
//      * @param totalAmount
//      * @return
//      */
//     public AjaxResult createRefund(String outTradeNo, Long totalAmount) {
//         //返回参数
//         LinkedHashMap map = new LinkedHashMap();
//         map.put("out_trade_no", outTradeNo);
//         map.put("success", false);
//         map.put("msg", "正在申请退款中！");
//         String outRefundNo = "REFUND_" + outTradeNo;
//         map.put("out_refund_no", outRefundNo);
//         //申请退款订单，需要变更订单记录
//        QueryWrapper wrapper = new QueryWrapper<WxOrder>();
//         wrapper.eq("out_trade_no", outTradeNo);
//         WxOrder wxOrderEntity = wxOrderService.selectOne(wrapper);
//         if (wxOrderEntity == null) {
//             return AjaxResult.error("订单不存在，申请退款不存在！");
//         }
//         wxOrderEntity.setPayStatus(4);//退款中
//         wxOrderEntity.setUpdateTime(new Date());
//         wxOrderService.updateById(wxOrderEntity);
//         try {
//             // 构建退款service
//             RefundService service = new RefundService.Builder()
//                     .config(rsaAutoCertificateConfig.initConfig())
//                     .build();
//             CreateRequest request = new CreateRequest();
//             // 调用request.setXxx(val)设置所需参数，具体参数可见Request定义
//             request.setOutTradeNo(outTradeNo);
//             request.setOutRefundNo(outRefundNo);
//
//             AmountReq amount = new AmountReq();
//             amount.setTotal(totalAmount);
//             amount.setRefund(totalAmount);
//             amount.setCurrency("CNY");
//
//             request.setAmount(amount);
//             request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl());
//
//             //接收退款返回参数
//             Refund refund = service.create(request);
//             log.info("退款返回信息：{}", refund);
//             if (refund.getStatus().equals(Status.SUCCESS)) {
//                 map.put("success", true);
//                 map.put("msg", "退款成功！");
//                 //说明退款成功，开始接下来的业务操作
//                 //主动查询
//                 QueryWrapper againWrapper = new QueryWrapper<WxOrder>();
//                 againWrapper.eq("out_trade_no", outTradeNo);
//                 WxOrder orderEntity = wxOrderService.selectOne(againWrapper);
//                 if (orderEntity != null) {
//                     orderEntity.setPayStatus(3);//退款成功
//                     orderEntity.setUpdateTime(new Date());
//                     wxOrderService.updateById(orderEntity);
//                     //同时处理退款记录
//                     QueryWrapper payWrapper = new QueryWrapper<WxPayLog>();
//                     payWrapper.eq("out_trade_no", outTradeNo);
//                     payWrapper.eq("pay_status", 2);//退款
//                     WxPayLog wxPayLogEntity = wxPayLogService.selectOne(payWrapper);
//                     if (wxPayLogEntity == null) {
//                         wxPayLogEntity = new WxPayLog();
//                         wxPayLogEntity.setCreateTime(new Date());
//                         wxPayLogEntity.setOutTradeNo(outTradeNo);
//                         wxPayLogEntity.setPayStatus(2);
//                         wxPayLogEntity.setTotalFee(new BigDecimal(totalAmount));
//                         wxPayLogEntity.setTransactionId(wxOrderEntity.getTransactionId());
//                         wxPayLogEntity.setOutRefundNo(outRefundNo);
//                         wxPayLogEntity.setWxOpenId(wxOrderEntity.getWxOpenId());
//                         wxPayLogService.insert(wxPayLogEntity);
//                     }
//                 }
//             }
//         } catch (ServiceException e) {
//             log.error("退款失败！，错误信息：{}", e.getMessage());
//             return AjaxResult.error("退款失败！");
//         } catch (Exception e) {
//             log.error("服务返回成功，返回体类型不合法，或者解析返回体失败，错误信息：{}", e.getMessage());
//             return AjaxResult.error("退款失败！");
//         }
//         return AjaxResult.success().put("data", map);
//     }
//
//     /** 微信申请退款
//      * @param outTradeNo 商户订单号
//      * @param totalAmount 退款金额，单位分
//      * @return*/
//     public AjaxResult createRefund(String outTradeNo, Long totalAmount, String outRefundNo) {
//         log.info("申请退款参数，outTradeNo：{}，totalAmount：{}，outRefundNo：{}", outTradeNo, totalAmount, outRefundNo);
//         //返回参数
//         LinkedHashMap map = new LinkedHashMap();
//         map.put("out_trade_no", outTradeNo);
//         map.put("success", false);
//         map.put("msg", "退款失败！");
//         if (StringUtils.isEmpty(outRefundNo)) {
//             outRefundNo = "REFUND_" + outTradeNo;
//         }
//         map.put("out_refund_no", outRefundNo);
//         //申请退款订单，需要变更订单记录
//        QueryWrapper wrapper = new QueryWrapper<WxOrder>();
//         wrapper.eq("out_trade_no", outTradeNo);
//         WxOrder wxOrderEntity = wxOrderService.selectOne(wrapper);
//         if (wxOrderEntity == null) {
//             return AjaxResult.error("订单不存在，申请退款不存在！");
//         }
//         wxOrderEntity.setPayStatus(4);//退款中
//         wxOrderEntity.setUpdateTime(new Date());
//         wxOrderService.updateById(wxOrderEntity);
//         try {
//             // 构建退款service
//             RefundService service = new RefundService.Builder()
//                     .config(rsaAutoCertificateConfig.initConfig())
//                     .build();
//             CreateRequest request = new CreateRequest();
//             // 调用request.setXxx(val)设置所需参数，具体参数可见Request定义
//             request.setOutTradeNo(outTradeNo);
//             request.setOutRefundNo(outRefundNo);
//
//             AmountReq amount = new AmountReq();
//             amount.setTotal(wxOrderEntity.getTotalFee().longValue());
//             amount.setRefund(totalAmount);
//             amount.setCurrency("CNY");
//
//             request.setAmount(amount);
//             request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl());
//
//             //接收退款返回参数
//             Refund refund = service.create(request);
//             log.info("退款返回信息：{}", refund);
//             //SUCCESS:退款成功，PROCESSING：正在处理中
//             if (refund.getStatus().equals(Status.SUCCESS)) {
//                 map.put("success", true);
//                 map.put("msg", "退款成功！");
//                 map.put("transaction_id", refund.getTransactionId());
//                 //说明退款成功，开始接下来的业务操作
//                 //主动查询
//                 QueryWrapper againWrapper = new QueryWrapper<WxOrder>();
//                 againWrapper.eq("out_trade_no", outTradeNo);
//                 WxOrder orderEntity = wxOrderService.selectOne(againWrapper);
//                 if (orderEntity != null) {
//                     orderEntity.setPayStatus(3);//退款成功
//                     orderEntity.setUpdateTime(new Date());
//                     wxOrderService.updateById(orderEntity);
//                     //同时处理退款记录
//                     QueryWrapper payWrapper = new QueryWrapper<WxPayLog>();
//                     payWrapper.eq("out_trade_no", outTradeNo);
//                     payWrapper.eq("pay_status", 2);//退款
//                     WxPayLog wxPayLogEntity = wxPayLogService.selectOne(payWrapper);
//                     if (wxPayLogEntity == null) {
//                         wxPayLogEntity = new WxPayLog();
//                         wxPayLogEntity.setCreateTime(new Date());
//                         wxPayLogEntity.setOutTradeNo(outTradeNo);
//                         wxPayLogEntity.setPayStatus(2);
//                         wxPayLogEntity.setTotalFee(new BigDecimal(totalAmount));
//                         wxPayLogEntity.setTransactionId(refund.getTransactionId());
//                         wxPayLogEntity.setOutRefundNo(outRefundNo);
//                         wxPayLogEntity.setWxOpenId(wxOrderEntity.getWxOpenId());
//                         wxPayLogService.insert(wxPayLogEntity);
//                     }
//                 }
//             } else if (refund.getStatus().equals(Status.ABNORMAL)) {
//                 map.put("success", false);
//                 map.put("msg", "退款失败，账户异常！");
//                 map.put("transaction_id", refund.getTransactionId());
//             } else if (refund.getStatus().equals(Status.PROCESSING)) {
//                 map.put("success", true);
//                 map.put("msg", "正在退款中！");
//                 map.put("transaction_id", refund.getTransactionId());
//             } else if (refund.getStatus().equals(Status.CLOSED)) {
//                 map.put("success", false);
//                 map.put("msg", "用户余额不足或者订单超过退款期限！");
//                 map.put("transaction_id", refund.getTransactionId());
//             }
//         } catch (ServiceException e) {
//             log.error("退款失败！，错误信息：{}", e.getErrorMessage());
//             return AjaxResult.error("退款失败！错误信息：" + e.getErrorMessage());
//         } catch (Exception e) {
//             log.error("服务返回成功，返回体类型不合法，或者解析返回体失败，错误信息：{}", e.getMessage());
//             return AjaxResult.error("退款失败！错误信息：" + e.getMessage());
//         }
//         log.info("微信退款响应参数：{}", map);
//         return AjaxResult.success().put("data", map);
//     }
//
//     /** 微信退款回调
//      * @param request
//      * @throws Exception*/
//     public void refundNotify(HttpServletRequest request) throws Exception {
//         try {
//             log.info("------收到退款通知------");
//             // 请求头Wechatpay-Signature
//             String signature = request.getHeader("Wechatpay-Signature");
//             // 请求头Wechatpay-nonce
//             String nonce = request.getHeader("Wechatpay-Nonce");
//             // 请求头Wechatpay-Timestamp
//             String timestamp = request.getHeader("Wechatpay-Timestamp");
//             // 微信支付证书序列号
//             String serial = request.getHeader("Wechatpay-Serial");
//             // 签名方式
//             String signType = request.getHeader("Wechatpay-Signature-Type");
//             // 构造 RequestParam
//             RequestParam requestParam = new RequestParam.Builder()
//                     .serialNumber(serial)
//                     .nonce(nonce)
//                     .signature(signature)
//                     .timestamp(timestamp)
//                     .signType(signType)
//                     .body(HttpServletUtils.getRequestBody(request))
//                     .build();
//
//             // 初始化 NotificationParser
//             NotificationParser parser = new NotificationParser( wxPayAutoConfig.rsaAutoCertificateConfig());
//             // 以支付通知回调为例，验签、解密并转换成 Transaction
//             log.info("验签参数：{}", requestParam);
//             RefundNotification parse = parser.parse(requestParam, RefundNotification.class);
//             log.info("验签成功！-退款回调结果：{}", parse.toString());
//             //parse.getRefundStatus().equals("SUCCESS");说明退款成功
//             String refundStatus = parse.getRefundStatus().toString();
//             log.info("getRefundStatus状态：{}", refundStatus);
//
//             if (refundStatus.equals("SUCCESS")) {
//                 log.info("成功进入退款回调，状态：{}", parse.getRefundStatus());
//                 //你的业务代码
//                QueryWrapper wrapper = new QueryWrapper<WxOrder>();
//                 wrapper.eq("out_trade_no", parse.getOutTradeNo());
//                 WxOrder wxOrderEntity = wxOrderService.selectOne(wrapper);
//                 log.info("订单数据：{}", wxOrderEntity);
//                 if (wxOrderEntity != null) {
//                     wxOrderEntity.setUpdateTime(new Date());
//                     wxOrderEntity.setPayStatus(3);//退款成功
//                     wxOrderEntity.setPayNonce(nonce);
//                     wxOrderService.updateById(wxOrderEntity);
//                     //同时处理退款记录
//                     QueryWrapper payWrapper = new QueryWrapper<WxPayLog>();
//                     payWrapper.eq("out_trade_no", parse.getOutTradeNo());
//                     payWrapper.eq("pay_status", 2);//退款
//                     payWrapper.eq("out_refund_no", parse.getOutRefundNo());//退款
//                     WxPayLog wxPayLogEntity = wxPayLogService.selectOne(payWrapper);
//                     if (wxPayLogEntity == null) {
//                         wxPayLogEntity = new WxPayLog();
//                         wxPayLogEntity.setCreateTime(new Date());
//                         wxPayLogEntity.setOutTradeNo(parse.getOutTradeNo());
//                         wxPayLogEntity.setPayStatus(2);
//                         wxPayLogEntity.setTotalFee(new BigDecimal(parse.getAmount().getRefund()));
//                         wxPayLogEntity.setTransactionId(parse.getTransactionId());
//                         wxPayLogEntity.setOutRefundNo(parse.getOutRefundNo());
//                         wxPayLogEntity.setWxOpenId(wxOrderEntity.getWxOpenId());
//                         wxPayLogService.insert(wxPayLogEntity);
//                     }
//                 }
//             }
//         } catch (Exception e) {
//             log.info("退款回调失败！错误信息：{}", e.getMessage());
//         }
//     }
//
//     @Override
//     public void success(WxOrder orderOld, com.wechat.pay.java.service.partnerpayments.nativepay.model.Transaction transaction) {
//         orderOld.setPayStatus(1);
//         orderOld.setPayTime(DateUtils.stringToDateTime(transaction.getSuccessTime()));
//         orderOld.setPayDate(DateUtils.stringToDateTime(transaction.getSuccessTime()));
//         wxOrderService.updateWxOrder(orderOld);
//     }
//
//     @Override
//     public WxOrder selectByOrder(String outTradeNo) {
//         return wxOrderService.selectOne(new QueryWrapper<WxOrder>().eq("out_trade_no", outTradeNo));
//     }
// }
